#ifndef __ESTADOCLIENTE_H_INCLUDED__
#define __ESTADOCLIENTE_H_INCLUDED__
#include "Mensajes.h"
#include "../Cliente.h"

//Sucio, pero funciona
#define __PLACEHOLDER__ { std::cout << "El comando no es valido en este contexto.\n"; }

class EstadoCliente{
protected:
	Cliente *cliente;
	
	std::string prepararComando(std::string s);
public:
	EstadoCliente(Cliente* cl);
	virtual void entradaTeclado(std::string comando);
	virtual void recibirListaJugadores(MensajeListaJugadores &m);
	virtual void obtenerListaJugadores();
	virtual void recibirInvitacion(MensajeInvitacion &m);
	virtual void invitar(int jugador);
	virtual void desconectar();
	virtual void recibirDesconeccion(MensajeDesconectar &m);
	virtual void mostrarTablero();
	virtual void recibirTablero(MensajeTablero &m);
	virtual void disparar(char x, char y);
	virtual void recibirDisparo(MensajeDisparo &m);
	virtual void recibirTurno();
	virtual void comenzarJuego(MensajeComenzarJuego &m);
	virtual void ganar();
	virtual void perder();
};


class SinEstado:public EstadoCliente{
};

class Conectado:public EstadoCliente{
public:
	Conectado(Cliente* cl);

	virtual void entradaTeclado(std::string comando);
	virtual void recibirListaJugadores(MensajeListaJugadores &m);
	virtual void obtenerListaJugadores();
	virtual void recibirInvitacion(MensajeInvitacion &m);
	virtual void invitar(int jugador);
	virtual void desconectar();
	virtual void recibirDesconeccion(MensajeDesconectar &m);
	virtual void comenzarJuego(MensajeComenzarJuego &m);
};

class PosicionandoBarcos: public EstadoCliente{
	bool respuesta;
public:
	PosicionandoBarcos(Cliente* cl);
	virtual void entradaTeclado(std::string comando);
	virtual void desconectar();
	virtual void recibirDesconeccion(MensajeDesconectar &m);
};

class EligiendoTurnos: public EstadoCliente{
public:
	EligiendoTurnos(Cliente* cl);
	virtual void entradaTeclado(std::string comando);
	virtual void desconectar();
	virtual void recibirDesconeccion(MensajeDesconectar &m);
};

class Jugando: public EstadoCliente{
	bool esperando;
	bool automatico;
	bool esperandoRevancha;
public:
 	Jugando(Cliente* cl);
	virtual void entradaTeclado(std::string comando);

	virtual void desconectar();
	virtual void recibirDesconeccion(MensajeDesconectar &m);
	virtual void mostrarTablero();
	virtual void recibirTablero(MensajeTablero &m);
	virtual void disparar(char x, char y);
	virtual void recibirDisparo(MensajeDisparo &m);
	virtual void recibirTurno();
	virtual void ganar();
	virtual void perder();
private:
	void dibujarTableros(MensajeTablero *m);
	void dibujarLinea(int ancho){
		for(int i=0;i<ancho;i++)
			std::cout << "-";
	}
};

#endif //__ESTADOCLIENTE_H_INCLUDED__
